package cn.teammade.sms.common.util;

import java.io.Serializable;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.ObjectMessage;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.apache.activemq.ScheduledMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.JmsException;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Component;

/**
 * 消息工具类
 * 
 * @author yi.wang
 * @date 2016年11月28日
 */
@Component
public class MessageProducer {

	@Autowired
	private JmsTemplate jmsTemplate;

	/**
	 * 发送文本消息
	 * @param queueName 队列名称
	 * @param textMessage 消息内容
	 * @param time 延迟投递的时间（毫秒）
	 * @throws Exception
	 */
	public void sendQueue(String queueName, final String textMessage, final Long time) {
		try {
			jmsTemplate.send(queueName, new MessageCreator() {
				@Override
				public Message createMessage(Session session) throws JMSException {
					TextMessage message = session.createTextMessage(textMessage);
					if (time != null) {
						message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, time);
					}
					return message;
				}
			});
		} catch (JmsException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 发送对象消息
	 * @param queueName 队列名称
	 * @param object 消息对象
	 * @param time 延迟投递的时间（毫秒）
	 * @throws Exception
	 */
	public void sendQueue(String queueName, final Serializable object, final Long time) {
		try {
			jmsTemplate.send(queueName, new MessageCreator() {
				@Override
				public Message createMessage(Session session) throws JMSException {
					ObjectMessage message = session.createObjectMessage(object);
					if (time != null) {
						message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, time);
					}
					return message;
				}
			});
		} catch (JmsException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 发送订阅消息
	 * @param topicName 队列名称
	 * @param textMessage 消息内容
	 * @throws Exception
	 */
	public void sendTopic(String topicName, final String textMessage) {
		try {
			jmsTemplate.setPubSubDomain(true);
			jmsTemplate.send(topicName, new MessageCreator() {
				@Override
				public Message createMessage(Session session) throws JMSException {
					return session.createTextMessage(textMessage);
				}
			});
		} catch (JmsException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 发送订阅对象消息
	 * @param topicName 队列名称
	 * @param object 消息对象
	 * @throws Exception
	 */
	public void sendTopic(String topicName, final Serializable object) {
		try {
			jmsTemplate.setPubSubDomain(true);
			jmsTemplate.send(topicName, new MessageCreator() {
				@Override
				public Message createMessage(Session session) throws JMSException {
					return session.createObjectMessage(object);
				}
			});
		} catch (JmsException e) {
			e.printStackTrace();
		}
	}

}
